Code assist for multiple statement patterns including automated translation of code examples to a user context

ABSTRACT

A process and system for assisting a user to write new lines of code of a computer program based on code examples. A first line in each code sample matching a specified anchor line. A loop having a custom line branch and a code assist branch is executed. The custom line branch generates a new line for the computer program via a custom line provided by the user. The code assist branch generates a new line for the computer program via code assist. The code assist determines a set of assist lines from the code samples, translates the assist lines to a user context in each code example, selects from the assist lines set of preferred lines sequenced in an order of preference, presents the set of preferred lines to the user, receives a preferred line selected by the user, and stores the preferred line as a new line.

RELATED APPLICATION

The present application is related to U.S. patent application Ser. No. 12/173,109, filed, Jul. 15, 2008 and entitled “CODE ASSIST FOR MULTIPLE STATEMENT PATTERNS”.

FIELD OF THE INVENTION

The present invention provides a process and system for assisting a user to write new lines of code of a computer program based on code examples.

BACKGROUND OF THE INVENTION

A code assist is software that assists a user writing a computer program to complete a partially complete (or incorrect) line of code that the user has typed, by suggesting a suitable set of completions for the typed line of code.

Current code assist software presents only limited assistance and the user is still required to use considerable manual effort to write the complete program in its entirety.

Accordingly, there is need for an improved code assist that enables the user to write the computer program with less manual effort than is required with current code assist software.

SUMMARY OF THE INVENTION

The present invention provides a process for assisting a user to write an ordered sequence of new lines of code (L₀, L₁, L₂, . . . ) of a computer program, said process using a plurality of code examples such that each code example comprises an ordered sequence of lines of code (X₀, X₁, X₂, . . . ), said process implemented by execution of instructions by a processor of a computer system, said instructions being stored on computer readable storage media of the computer system, said process utilizing an index R that points to line L_(R) (R=0, 1, 2, . . . ) and initially points to the first line L₀ of the new lines of code, said process utilizing an index K that points to line X_(K) (K=0, 1, 2, . . . ) and initially points to the first line X₀ of the ordered sequence of lines of code, said process comprising:

receiving and storing line L₀, wherein is an anchor line;

after said receiving and storing line L₀, selecting the plurality of code examples based on line X₀ in each selected code example matching line L₀ due to a method in line X₀ of each code example being of a same type and having a same signature as a method in line L₀;

after said selecting the plurality of code examples, ascertaining whether a custom line of code is inputted after said storing line L_(R) is performed;

if said ascertaining ascertains that a custom line of code is inputted after said storing line L_(R) is performed, then incrementing R by 1, followed by establishing line L_(R) as a new custom line of code, and followed by storing line L_(R);

if said ascertaining ascertains that a custom line of code is not inputted after said storing line L_(R) is performed, then incrementing K by 1 and determining N=F(R) such that F(R) is a specified function of R, followed by identifying a set of assist lines (X_(K), X_(K+1), . . . , X_(NMIN)) in each code example X such that NMIN is a minimum of N and the highest line number in each code example, followed by translating the assist lines to a user context in each code example, followed by determining a set of preferred lines sequenced in an order of preference such that the preferred lines are selected from the translated assist lines in the code examples, followed by presenting to the user the set of preferred lines sequenced in the order of preference, followed by receiving a selected line selected by the user from the set of preferred lines, followed by incrementing R by 1, followed by establishing line L_(R) to be the edited selected line, and followed by storing line L_(R); and

after storing line L_(R), stopping the process if a stopping criterion is satisfied, otherwise looping back to said ascertaining.

The present invention provides a computer program product, comprising a computer readable storage medium having a computer readable program code stored therein, said computer readable program code containing instructions that when executed by a processor of a computer system implement a process for assisting a user to write an ordered sequence of new lines of code (L₀, L₁, L₂, . . . ) of a computer program, said process using a plurality of code examples such that each code example comprises an ordered sequence of lines of code (X₀, X₁, X₂, . . . ), said process utilizing an index R that points to line L_(R) (R=0, 1, 2, . . . ) and initially points to the first line L₀ of the new lines of code, said process utilizing an index K that points to line X_(K) (K=0, 1, 2, . . . ) and initially points to the first line X₀ of the ordered sequence of lines of code, said process comprising:

receiving and storing line L₀, wherein is an anchor line;

after said receiving and storing line L₀, selecting the plurality of code examples based on line X₀ in each selected code example matching line L₀ due to a method in line X₀ of each code example being of a same type and having a same signature as a method in line L₀;

after said selecting the plurality of code examples, ascertaining whether a custom line of code is inputted after said storing line L_(R) is performed;

if said ascertaining ascertains that a custom line of code is inputted after said storing line L_(R) is performed, then incrementing R by 1, followed by establishing line L_(R) as a new custom line of code, and followed by storing line L_(R);

if said ascertaining ascertains that a custom line of code is not inputted after said storing line L_(R) is performed, then incrementing K by 1 and determining N=F(R) such that F(R) is a specified function of R, followed by identifying a set of assist lines (X_(K), X_(K+1), . . . , X_(NMIN)) in each code example X such that NMIN is a minimum of N and the highest line number in each code example, followed by translating the assist lines to a user context in each code example, followed by determining a set of preferred lines sequenced in an order of preference such that the preferred lines are selected from the translated assist lines in the code examples, followed by presenting to the user the set of preferred lines sequenced in the order of preference, followed by receiving a selected line selected by the user from the set of preferred lines, followed by incrementing R by 1, followed by establishing line L_(R) to be the edited selected line, and followed by storing line L_(R); and

after storing line L_(R), stopping the process if a stopping criterion is satisfied, otherwise looping back to said ascertaining.

The present invention provides a computer system comprising a processor and a computer readable memory unit coupled to the processor, said memory unit containing instructions that when executed by the processor implement a process for assisting a user to write an ordered sequence of new lines of code (L₀, L₁, L₂, . . . ) of a computer program, said process using a plurality of code examples such that each code example comprises an ordered sequence of lines of code (X₀, X₁, X₂, . . . ), said process utilizing an index R that points to line L_(R) (R=0, 1, 2, . . . ) and initially points to the first line L₀ of the new lines of code, said process utilizing an index K that points to line X_(K) (K=0, 1, 2, . . . ) and initially points to the first line X₀ of the ordered sequence of lines of code, said process comprising:

receiving and storing line L₀, wherein is an anchor line;

after said receiving and storing line L₀, selecting the plurality of code examples based on line X₀ in each selected code example matching line L₀ due to a method in line X₀ of each code example being of a same type and having a same signature as a method in line L₀;

after said selecting the plurality of code examples, ascertaining whether a custom line of code is inputted after said storing line L_(R) is performed;

if said ascertaining ascertains that a custom line of code is inputted after said storing line L_(R) is performed, then incrementing R by 1, followed by establishing line L_(R) as a new custom line of code, and followed by storing line L_(R);

if said ascertaining ascertains that a custom line of code is not inputted after said storing line L_(R) is performed, then incrementing K by 1 and determining N=F(R) such that F(R) is a specified function of R, followed by identifying a set of assist lines (X_(K), X_(K+1), . . . , X_(NMIN)) in each code example X such that NMIN is a minimum of N and the highest line number in each code example, followed by translating the assist lines to a user context in each code example, followed by determining a set of preferred lines sequenced in an order of preference such that the preferred lines are selected from the translated assist lines in the code examples, followed by presenting to the user the set of preferred lines sequenced in the order of preference, followed by receiving a selected line selected by the user from the set of preferred lines, followed by incrementing R by 1, followed by establishing line L_(R) to be the edited selected line, and followed by storing line L_(R); and

after storing line L_(R), stopping the process if a stopping criterion is satisfied, otherwise looping back to said ascertaining.

The present invention provides an improved code assist that enables the user to write the computer program with less manual effort than is required with current code assist software.

BRIEF DESCRIPTION OF THE DRAWINGS

FIG. 1 is a flow chart describing a process for assisting a user to write an ordered sequence of new lines of code of a computer program, said process presenting automated translation of code examples to the user, in accordance with embodiments of the present invention.

FIGS. 2 and 3 are flow charts describing in detail the automated translation of code examples of FIG. 1, in accordance with embodiments of the present invention.

FIG. 4 illustrates a computer system used for assisting a user to write an ordered sequence of new lines of code of a computer program, in accordance with embodiments of the present invention.

DETAILED DESCRIPTION OF THE INVENTION

A statement of program code will be referred to as a “line of code” or a “line”.

The code assist of the present invention creates dynamic, multi-line templates for call sequences of more than one line to complete a particular software action. When a code assist is activated, the system not only looks at what the user has typed and the definition of the target object/method, but also looks at other calls to the same method in available source code examples. Each code example comprises a plurality of lines of code.

The code completion is activated in two stages.

In the first stage, the user provides an initial line, called an anchor line, of the program portion to be assisted. The anchor line calls a method and this method serves as a foundation for developing subsequent lines of the program during the second stage.

In the second stage which occurs after the first stage, the system searches for lines calling the method in the anchor line or similar lines in the code examples in order to suggest additional subsequent lines from which the user may select for subsequent insertion into the program portion being written. Relationships and other characteristics of lines in the code examples provide criteria for generating and prioritizing the suggested additional subsequent lines.

In one embodiment, a line of code has the following form:

(r=} t.m(<a>);

wherein:

r is an optional assignment variable of type R;

t is an object variable of type T;

m is a method declared on type T;

<a>is a signature, namely the number and type of arguments comprising at least one variable and/or expression.

Although the examples presented herein conform to the preceding form for a line of code, the scope of the present invention includes other forms of lines of code that exist in various programming languages such as Java, C++, etc.

Consider any two lines, Line0 and Line1:

Line0: r0=t0.m0(<a0>).

Line1: r1=t1.m1(<a1>).

By definition, any two lines (Line0 and Line1) match if methods m0 and m1 are of a same type and have a same signature.

By definition, the two methods m0 and m1 are of the same type if m0 and m1 are defined on the same class. For example, if object variable t0 is of type T0 and object variable t1 is of type T1, and if the methods m0 and m1 are defined on a common super class of T0 and T1 (or common super interface if m0 and m1 are defined on common interface implemented by T0 and T1, respectively), and if the signatures <a0> and <a1> have a same signature, then Line0 and Line 1 match.

By definition, the two methods m0 and m1 have the same signature if m0 and m1 have the same number of arguments and if corresponding arguments in m0 and m1 are of a same type. For example, if the signature <a0> of method m0 is (int I0, boolean B0) and if the signature <a1> of method m1 is (int I1, boolean B1), then the signatures <a0> and <a1> each have 2 arguments such that the corresponding arguments in <a0> and <a1> are of the same type, namely int and boolean, respectively.

FIG. 1 is a flow chart describing a process for assisting a user to write an ordered sequence of new lines of code (L₀, L₁, L₂, . . . ) of a computer program, in accordance with embodiments of the present invention. The initial new line of code (L₀) is an anchor line that may be supplied by a user. The process uses a plurality of code examples such that each generic code example X comprises an ordered sequence of lines of code (X₀, X₁, X₂, . . . ). The process is implemented by execution of instructions by a processor of a computer system (e.g., the computer system 90 described infra in conjunction with FIG. 2), said instructions being stored on computer readable storage media of the computer system. The process described in FIG. 1 comprises steps 10-19, which will be described infra using the following illustrative example to illustrate the steps of the process of FIG. 1.

L₀ TreeViewer tree = widgetFactory.createTreeViewer(container);

CODE EXAMPLE A

A₀ TreeViewer selectionViewer=factory.createTreeViewer(parent); A₁ selectionViewer.setLayoutData(new GridData(GridData.FILL_BOTH)); A₂ selectionViewer.setContentProvider(newAdapterFactoryContentProvider(adapterFactory)); A₃ selectionViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory));

CODE EXAMPLE B

B₀ TreeViewer treeViewer=factory.createTreeViewer(parent); B₁ parent.setLayoutData(gd); B₂ parent.setLayout(fill); B₃ treeViewer.setAutoExpandLevel(30); B₄ treeViewer.setContentProvider(new ReverseAdapterFactoryContentProvider(adaptFactory)); B₅ treeViewer.setLabelProvider(new AdapterFactoryLabelProvider(adaptFactory));

CODE EXAMPLE C

C₀ TreeViewer treeViewer=factory.createTreeViewer(parent); C₁ treeViewer.setLayoutData(new GridData(GridData.FILL_BOTH)); C₂ parent.setLayout(new GridLayout( )); C₃ treeViewer.setAutoExpandLevel(30); C₄ treeViewer.setContentProvider(new ReverseAdapterFactoryContentProvider(adaptFactory)); C₅ treeViewer.setLabelProvider(new AdapterFactoryLabelProvider(adaptFactory));

The preceding illustrative example uses 3 code examples: A, B, and C. Therefore, in Example A the generic code example X₀, X₁, X₂, . . . is instantiated as A₀, A₁, A₂, A₃, in Example B the generic code example X₀, X₁, X₂, . . . is instantiated as B₀, B₁, B₂, B₃, B₄, B₅, and in Example C the generic code example X₀, X₁, X₂, . . . is instantiated as C₀, C₁, C₂, C₃, C₄, C₅.

In FIG. 1, step 10 receives the anchor line Lo from the user (e.g., by user entry such as by typing the anchor line, selecting the anchor line from a menu, etc.). Alternatively, the anchor line L₀ may be extracted from the storage media of the computer system (e.g., from a file). The received anchor line L₀ is subsequently stored in the storage media of the computer system.

Step 11 selects the plurality of code examples based on the initial line X₀ in each selected code example matching the anchor line L₀. By definition, said matching requires a method in the initial line X₀ of each code example X to be of a same type and have a same signature as a method in the anchor line L₀. In code examples A, B, and C, the respective initial line A₀, B₀, and C₀ contain method calls on variables named “factory”, all said variables assumed to be of the same type (say Factory) and each method has a signature of “parent” (assumed to all be of type Container). The anchor line L₀ contains a method call on a variable named “widgetFactory” (assumed to be of type Factory) and has a signature of “container” (assumed to be of type Container). Therefore, it is assumed for this illustrative example that the type “factory” and “widgetFactory” are a same type, and type “parent” and “container” are a same type. Therefore, lines A₀, B₀, and C₀ each match the anchor line L₀.

Step 12 sets an index R to 0 and an index K to 0. Lines 13-20 define a loop and the index R is an iteration index for the loop starting with R=0 for the first iteration of the loop. The index R also indexes the new lines (L_(R)) generated for the computer program being written by the user, since a new line for the computer program is established and stored in step 19 for each iteration of the loop. The loop splits at step 13 into a code assist branch and a custom line branch. The code assist branch generates a new line for the computer program via code assist (steps 14-18 executed). The custom line branch generates a new line for the computer program via a custom line of code provided by the user (steps 14-18 bypassed). Both branches merge into step 19 at which the new line (L_(R)) for the computer program is established and stored.

The index K is a code assist counter which is incremented in step 14 each time the code assist branch (steps 14-18) of the loop is executed.

Step 13 ascertains (e.g., by querying the user) whether a custom line of code is being inputted in the current iteration R since the last new line (L_(R)) was established and stored. The user may input a custom line during any iteration of the loop. Each such custom line of code becomes a next new line of code (L_(R)) for the computer program being written by the user.

If step 13 ascertains that a custom line of code is being inputted, then step 19 is next performed and the code assist sequence (steps 14-18) is not executed for the current iteration R.

If step 13 ascertains that a custom line of code has not been inputted in the current iteration (i.e., after storing line L_(R) was performed for the current value of R), then code assist steps 14-18 are next performed, followed by execution of step 19.

Step 14 increments K by 1, determines N from N=F(R) via specified function F(R), determines NMIN as a minimum of N and the highest line number in each code example, and identifies a set of assist lines X_(K), . . . , X_(NMIN) in each code example X. In the illustrative example, K=1 in the current iteration of R=0.

The function F(R) may be expressed in the form of an analytical function of R such as F(R)=ceiling(1.5*R+1) wherein the function ceiling(Z) returns the smallest integer not less than Z. Alternatively, the function F(R) may be expressed as a table of N versus R For the illustrative example, it is assumed that N=1 at R=0, which is the value of N obtained using N=ceiling(1.5*R+1). Furthermore, NMIN=N=1 at the current iteration of R=0, since the minimum of N (i.e., 1) and the highest line number in each code example is 1. In one embodiment, N exceeds R+1 to allow for introduction of custom lines of code by the user. Table 1 illustrates the function ceiling(1.5*R+1).

TABLE 1 Lines Completed R N = ceiling(1.5 * R + 1) L₀ 0 1 L₀, L₁ 1 3 L₀, L₁, L₂ 2 4 L₀, L₁, L₂, L₃ 3 6 L₀, L₁, L₂, L₃, L₄ 4 7

Thus for the illustrated example, K=1 and R=0 so that the set of assist lines for this iteration (R=0) is A₁, B₁, and C₁ for code example A, B, and C, respectively.

Step 15 translates the assist lines X_(K), . . . , X_(NMIN) in each code example X, which were identified in step 14, to a user context (i.e., to a format compatible with the semantics and syntax of the computer program being written by the user). Given the index K and the current iteration R, step 15 utilizes lines L₀, L₁, . . . L_(R) as input for performing the translation of assist lines X_(K), . . . , X_(NMIN) in each code example X to the user context. Lines L₀, L₁, . . . L_(R) have each been provided and/or selected by the user (in steps 10, 13, 18) and thus define the user context.

FIGS. 2 and 3 are flow charts describing in detail an automated translation of the code examples for step 15 of FIG. 1, in accordance with embodiments of the present invention. The algorithm of step 15 of FIG. 1, as described in FIGS. 2 and 3, is performed independently for each code example X. For example, the algorithm of step 15 of FIG. 1, as described in FIGS. 2 and 3, is performed independently for the code examples A, B, and C.

FIG. 2 comprises steps 31-35. The line X_(n), after being translated to a user context, is represented symbolically as X_(n)′ (n=0, 1, 2, . . . ). Thus lines A_(n), B_(n), and C_(n), of the code examples A, B, and C, after being translated to a user context, is represented symbolically as A_(n)′, B_(n)′, and C_(n)′, respectively (n=0, 1, 2, . . . ).

Step 31 sets an index r to 0 and sets a list S to empty. The index r denotes an iteration comprising steps 32-35 of a loop and also serves as a pointer to L_(r) (r=0, 1, . . . , R). The list S will cumulatively store values of a minimum index k determined in step 32.

Step 32 determines a minimum integer k selected from the group consisting of 0, 1, . . . , and NMIN such that k is not in the list S and line X_(k) matches line L_(r) due to a method in line X_(k) being of a same type and having a same signature as a method in line L_(r).

Step 33 hierarchically maps variables in sub-expressions of line X_(k) to positionally equivalent variables in line L_(r). A variable in line X_(k) is defined to be positionally equivalent to a variables in line L_(r) if lines X_(k) and L_(r) match and if the variable in line X_(k) and the variable in line L_(r) are in a same relative location structurally within lines X_(k) and L_(r), respectively. Step 33 is described in greater detail in FIG. 3.

Step 34 determines whether r=R. If step 34 determines that r=R then the automated translation of FIG. 2 stops and is completed and control returns to step 16 of FIG. 2. If step 34 determines that r≠R then step 35 increments r by 1 and adds k to the list S, followed by looping back to step 32 to perform the next iteration of steps 32-35 with respect to the index r starting with determining the minimum k in step 32. Note that by adding k to the list S in step 35, the index k found to be the minimum k in step 32 is excluded from being a minimum k in step 32 of a subsequent iteration because step 32 requires the minimum k to not be in the list S.

In one embodiment, there is no integer k satisfying the conditions of step 32 (i.e., k is not in the list S and line X_(k) matches line L_(r)) at a particular iteration r. In this embodiment, the next step 33 after step 32 is bypassed (since no mappings can be performed) and step 34 is next executed to either stop (if r=R) or otherwise increment r by 1 in step 35 and loop back to step 32 to perform the next iteration r.

FIG. 3 is a flow chart describing the hierarchical mapping step 33 of FIG. 2 in greater detail. The hierarchical aspect of step 33 relates to hierarchical relationships among variables embedded within levels of sub-expressions. For example, consider the expression of W0.M(W1(W2(W3))) defines a hierarchy W1→W2→W3 in which W1 is at level 0 representing a top level or root level of the hierarchy, W2 is a child of W1 and is at a sub-expression level 1 of the hierarchy, and W3 is a child of W2 and is at a sub-expression level 2 of the hierarchy. W3 is called a “leaf node”, because W3 is at a lowest level of the hierarchy (i.e., at sub-expression level 2 of the hierarchy). Note that W0 is at a sub-expression level consisting of a top level and Wo has no child nodes.

FIG. 3 comprises steps 41-45.

Step 41 determines a maximum sub-expression level (I_(MAX)) for line X_(k), wherein k is the minimum k determined in step 32 of FIG. 2. I_(MAX)=0 denotes a top level (i.e., a sub-expression level consisting of a top level). Step 41 also sets a sub-expression level index I to 0. The index I also serves as an iteration number for a loop of comprising steps 42-45.

For sub-expression level I, step 42 determines a mapping M_(I)(k→r) of at least one variable in line X_(k) to a corresponding at least one positionally equivalent variable in line L_(r).

Step 43 applies the mapping M_(I)(k→r) to lines (X_(K), X_(K+1), . . . , X_(NMIN)) to partially translate lines (X_(K), X_(K+1), . . . , X_(NMIN)) to the user context. In one embodiment, the M_(I)(k→r) does not result in one or more of the lines(X_(K), X_(K+1), . . . , X_(NMIN)) being translated to the user context.

Step 44 determines whether I=I_(MAX). If step 44 determines that I=I_(MAX) then the hierarchical mapping procedure of FIG. 3 stops and is completed; otherwise step 45 increments I by 1 and then loops back to step 42 to perform the next iteration of steps 42-45 with respect to the index I beginning with determining the mapping M_(I)(k→r) for sub-expression level I in step 42.

In one embodiment I_(MAX)=0, denoting the existence of only top-level variables. In one embodiment I_(MAX)≧1, denoting the existence of at least one variable at one or more levels below the top level.

In one embodiment, there is a code example X such that at iteration R=R1≧1 in the loop of FIG. 1, a custom line of code is inputted (see step 13 in FIG. 1). Then in a subsequent iteration R=R2>R1 in FIG. 1, a custom line of code is not inputted and an iteration r=r1 in FIG. 2 is characterized by R1<r1≦R2. In one sub-embodiment, determining the minimum integer k at r=r1 in step 32 of FIG. 3 comprises determining that there is no value of k selected from 0, 1, . . . , and XMIN such that line X_(k) matches line L_(R1), resulting in bypassing the mapping step 33 in FIG. 2 for r=r1. In one sub-embodiment, determining the minimum integer k at r=r1 in step 32 of FIG. 3 comprises determining the minimum integer k such that k is not in the list S and that line X_(k) matches line L_(R1), resulting in executing the mapping step 33 in FIG. 2 for r=r1.

The following example illustrates the algorithm of FIGS. 2 and 3. The inputed anchor line L₀, the new line L₁, and an illustrative code example X comprising lines X₀, X₁, and X₂ are as follows:

L₀ Type2 U2 = U0.M1( ); L₁ Type1 U1 = U2.M2(U1.M3(U1A); X₀ Type2 V2 = V0.M1( ); X₁ Type1 V1 = V2.M2(V1.M3(V1A)); X₂ Type3 V3 = V1.M4(V2,V1A);

It is assumed that the new line L₁ was established at step 19 in FIG. 1 at the end of the R=0 iteration, so that the next iteration of the loop of FIG. 1 is R=1 with K=1.

At R=1 and K=1, assume that NMIN=2 is determined in step 14 of FIG. 1. Therefore lines X₁ and X₂ are to be translated to a user context in step 15 of the R=1 iteration, as implemented in the algorithm of FIGS. 2 and 3.

Step 31 of FIG. 2 sets r=0 and sets list S to empty. Step 32 determines that k=0 is the minimum k such that k is not in list S and line X_(k) matches line L_(r) since line X₀ matches line L₀. Then step 33 is implemented by the algorithm of FIG. 3. Step 41 of FIG. 3 determines that I_(MAX)=0 since line X₀ comprises variables V2 and V0 at level 0 and no variables at level 1. Step 41 also sets I=0. Step 42 determines the mapping M_(I)(k→r)=M₀(0→0) of V2→U2 and V0→U0 (i.e.,V2 maps to U2, and V0 maps to U0). Step 43 applies the preceding mapping M₀(0→0) to lines X₁ and X₂ at level 0 (i.e., I=0), resulting in line X₁ being translated to V1=U2.M2(V1.M3(V1A)) and line X₂ being translated to V3=V1.M4(U2,V1A);. Step 44 determines that I=I_(MAX) and control returns to step 34 of FIG. 2 which determines that r<R (i.e., 0<1) and step 35 increments r by 1 and adds k=0 to list S.

In the r=1 iteration of FIG. 2, step 32 determines that k=1 is the minimum k such that k is not in list S and line X_(k) matches line L_(r) since k=0 is in list S and line X₁ matches line L₁. Then step 33 is implemented in the algorithm of FIG. 3. Step 41 of FIG. 3 determines that I_(MAX)=1 since line X₁ comprises variables V1A at level 1. Step 41 also sets I=0. Step 42 determines the mapping M_(I)(k→r)=M₀(1→1) of V1→U1 (i.e., V1 maps to U1). Step 43 applies the preceding mapping M₀(1→1) to lines X₁ and X₂, at level 0 (i.e., I=0), resulting in line X₁ being further translated to U1=U2.M2(U1.M3 (V1A)); and line X₂ further being translated to V3=U1.M4(U2,V1A);. Step 44 determines that I<I_(MAX) and step 45 increments I by 1 (resulting in I=1), followed by looping back to step 42.

At I=1, the mapping M_(I)(k→r)=M₁(1→1) at level 1 is V1A→U1A (i.e., V1A maps to U1A). Step 43 applies the preceding mapping M_(I)(1→1) to lines X₁ and X₂, at level 1 (i.e., I=1), resulting in line X₁ being further translated to U1=U2.M2(U1.M3(U1A)); and line X₂ being further translated to V3=U1.M4(U2,U1A);. Step 44 determines that I=I_(MAX) and and control returns to step 34 of FIG. 2 which determines that r=R (i.e., 1=1) and the translation procedure at R=1 has been completed, resulting in line X₂′ (i.e., the translated X₂) of V3=U1.M4(U2,U1A);. It is noted that variable V3 was not translated to a user context and therefore may be manually translated to a user context by the user if the user subsequently selects line X₂′ for becoming L₂ (see discussion of step 18 of FIG. 1).

Returning to FIG. 1 for the current iteration of R=0 with K=1 and NMIN=1, the assist lines A₁, B₁, and C₁ identified in step 14 are translated to a user context by the algorithms of FIGS. 2-3 as follows. The mapping for Example A is SelectionViewer→tree and parent→container from lines A₀ and L₀, resulting in line A₁ being translated to A₁′. The mapping for Example B is treeViewer→tree and parent→container from lines B₀ and L₀, resulting in line B₁ being translated to B₁′. The mapping for Example C is treeViewer→tree and parent→container from lines C₀ and L₀, resulting in line C₁ being translated to C₁′. The translated lines A₁′, B₁′, and C₁′ are:

A₁′ tree.setLayoutData(new GridData(GridData.FILL_BOTH)); B₁′ container.setLayoutData(gd); C₁′ tree.setLayoutData(new GridData(GridData.FILL)_BOTH));.

Step 16 determines a set of preferred lines from the translated assist lines A₂′, B₂′, and C₂′ from step 15 for code examples A, B, and C, respectively, said preferred lines being sequenced in an order of preference such that one of the preferred lines will be subsequently selected by the user from the set of assist lines in the code examples. In other words, all preferred lines determined in step 16 was previously translated to the user context in step 15. In one embodiment, the set of preferred lines consists of all lines of the set of assist lines in the code examples. In one embodiment, the set of preferred lines consists of fewer than all lines of the set of assist lines in the code examples. Various criteria could be selectively employed to sequence the preferred lines in order of preference.

One criteria for determining a set of preferred lines sequenced in order of preference is “matched line grouping” which is defined as grouping lines such that the lines within each group match each other, and the groups are ranked in descending order of the number of lines in each group. For example, if two groups G1 and G2 are formed such that group G1 consists of 3 lines matching each other and group G2 consists of 5 lines matching each other, then the 5 lines in group G2 are ranked higher than the 3 lines in group G1, because 5 is greater than 3.

For the illustrative example, the set of preferred lines are selected from the set of translated assist lines of A₁′, B₁′, and C₁′ for code examples A, B, and C, respectively in the current iteration of R=0. The lines A₁′, B₁′, and C₁′ match each other because they each call the same method “setLayoutData” of the same type and have the same signature (“new GridData(GridData.FILL_BOTH)” and “gd” are assumed to be of the same type). Thus with only one such group, there is no preferential ranking or ordering of lines A₁′, B₁′, and C₁′. Therefore, the set of preferred lines could sequence A₁′, B₁′, and C₁′ in any order.

One criteria for determining a set of preferred lines sequenced in order of preference is “positional equivalence grouping” which is defined as grouping lines such that the lines within each group comprise an object variable that appears in a same relative position in a respective preceding line, and the groups are ranked in descending order of the number of lines in each group. For example, if two groups G1 and G2 are formed such that group G1 consists of 3 lines positionally equivalent to each other and group G2 consists of 5 lines positionally equivalent to each other, then the 5 lines in group G2 are ranked higher than the 3 lines in group G1, because 5 is greater than 3.

For the illustrative example, lines A₁′ and C′₁ are better choices than line B₁′ to present hierarchically to the user, because lines A₁′ and C₁′ are positionally equivalent with respect to their previous lines A₀′ and C₀′, respectively, and line B₁′ is not positionally equivalent to line A₁′ and/or C₁′. In particular, lines A₁′ and C₁′ are positionally equivalent with respect to their respective previous lines A₀′ and C₀′, because the same method (setLayoutData) in lines A₁′ and C₁′ is called on an object variable “selectionViewer” and “treeViewer”, respectively, such that “tree” (translated from “selectionViewer”) and “tree” (translated from “treeViewer”) appear in equivalent positions within lines A₀′ and C₀′, respectively. In contrast in line B₁′, the method (setLayoutData) is called on object variable “container (translated from “parent”) which appears in a different position in its previous line B₀′ than does the position of object variable “tree” (translated from “selectionViewer”) and “tree” (translated from “treeViewer”) of lines A₁′ and C₁′ in their previous lines A₀ and C₀, respectively. Therefore, lines A₁′ and C₁′ are ranked higher than line B₁′. Thus, the set of preferred lines could be sequenced as A₁′, C₁′, B₁′ or as C₁′, A′₁, B₁′. Alternatively, line B₁′ could be omitted such that the set of preferred lines is sequenced as A′, C₁′ or as C₁′, A₁′.

One criteria for determining a set of preferred lines sequenced in order of preference is “matched variable grouping” which is defined as a grouping two lines characterized by a percentage of matches of positionally corresponding variables in the two lines, and the groups are ranked in descending order of said percentage. For example, if two groups G1 and G2 are formed such that two lines in group G1 have a percentage of 75% of matches of positionally corresponding variables and two lines in group G2 have a percentage of 60% of matches of positionally corresponding variables, then the 2 lines in group G1 are ranked higher than the 2 lines in group G2, because 75% is greater than 60%.

For the illustrative example, the set of preferred lines are selected from the set of assist lines of A₁′, B₁′, and C₁′ for code examples A, B, and C, respectively. The lines A₁′ and B₁′ have a percentage of 0% of matches of positionally corresponding variables. The lines C₁′ and B₁′ have a percentage of 0% of matches of positionally corresponding variables. The lines A₁′ and C₁′ have a percentage of 100% of matches of positionally corresponding variables (i.e., variable “GridData(GridData.FILL_BOTH)”. See lines A₁ and C₁ below.

A₁′ tree.setLayoutData(new GridData(GridData.FILL_BOTH)); C₁′ tree.setLayoutData(new GridData(GridData.FILL_BOTH)); Therefore, the set of preferred lines could be sequenced as A₁′, C₁′,B₁′ or as C₁′, A₁′,B₁′. Alternatively, line B₁′ could be omitted such that the set of preferred lines is sequenced as A₁′, C₁ or as C₁′, A₁′.

An example of the calculation of percentage of matches of positionally corresponding variables is illustrated in the following comparison of lines U1 and V1.

U1 Object gd1= tree1.setLayoutData (1,container1,new GridData(gd1,”A”)); V1 Object gd1= container1.setLayoutData(2,container1,new GridData(gd1,null););

There are 3 matched variable comparisons: “gd1” (appearing to the left of “=”), “container”, and “gd1” (appearing to the right of “=”). There is 1 unmatched variable comparison: “tree1” in line U1 versus “container1” in line V1. Therefore, the percentage of matches in the group of U1 and V1 is 75% (i.e., ¾).

Step 17 presents to the user the set of preferred lines sequenced in the order of preference.

Step 18 receives a selected line that was selected by the user from the set of preferred lines. The user had selected a preferred line from the presented set of preferred lines. For the illustrative example, assume that the set of preferred lines sequenced in the order of preference consists of A₁′, C₁′, and B₁′ such that lines A₁′ and C₁′ are preferentially equivalent to each other and both are preferred over line B₁′. Then the selected preferred line selected by the user may be line C₁′. The selected preferred line (C₁′) is either completely translated to the user context (via step 15) or is not completely translated to the user context such that the user may edit the selected preferred line (C₁′) to fit the user's context (i.e., to be compatible with the semantics and syntax of the computer program being written by the user). For this example, the user selects line C₁′ which will result in L₁=C₁′ in step 19.

Step 19 increments R by 1, establishes the new line L_(R), and stores line L_(R) in the storage media. If the current iteration is processing a custom line of code, then the new line L_(R) is the custom line of code. If the current iteration is not processing a custom line of code but has instead executed code assist steps 14-18, then the new line L_(R) is the selected line received in step 18. In the illustrated example, the selected line (C₁′) is:

C₁′ tree.setLayoutData(new GridData(GridData.FILL_BOTH));

Step 19 increments R by to 1 (i.e., to R=1) and stores the new line L_(1.)=C₁′.

Step 20 stops the process of FIG. 1 if a stopping criterion is satisfied, otherwise the process loops back to step 13 to perform the next iteration R. The stopping criteria may comprise detection of a directive by the user to stop the process such as detecting that a special key (e.g., the escape key) or detecting the directive as a response by the user to being queried as to whether the user desires to stop the process. Another stopping criteria is when R+1 exceeds a specified threshold value (e.g., 10, 20, etc.).

In the illustrated example, it is assumed that the process does not stop at step 20 after line L₁ has been stored in step 19. Thus the process loops back to step 13 to execute the next iteration characterized by R=1. It is assumed that a custom line of code has been inputted for the R=1 iteration, so that the process bypasses steps 14-18 and branches directly to step 19 at which R is incremented to R=2 and the new line L₂ (from custom line of code) is stored. The new line L₂ in this example is the custom line of: tree.setTitle(“My treeviewer”);.

In the illustrated example, it is assumed that the process does not stop at step 20 after line L₂ has been stored in step 19. Thus the process loops back to step 13 to execute the next iteration characterized by R=2. It is assumed that a custom line of code has not been inputted for the R=2 iteration, so that the process executes the code assist branch of steps 14-18 to determine the next new line (L₃).

Step 14 increments K by 1 to K=2, determines N from N=F(R), determines NMIN, and identifies a set of assist lines X_(K), . . . , X_(MIN) in each code example X.

In the illustrative example, K=2 in the current iteration of R=2. Using F(R)=ceiling(1.5*R+1), it is determined that N=4. The maximum line number of code examples A, B, and C is 3, 5, and 5, respectively Therefore since each NMIN is the minimum of N and the highest line number of the corresponding code example, NMIN is 3, 4, and 4 for code examples A, B, and C, respectively. Thus, the set of assist lines are: lines A₂, A₃ from Example A, lines B₂, B₃, B₄ from Example B, and lines C₂, C₃, C₄ from Example C. More explicitly, the set of assist lines, and the set of lines L₀, L₁, L₂, are:

A₂ selectionViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory)); A₃ selectionViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory)); B₂ parent.setLayout(fill); B₃ treeViewer.setAutoExpandLevel(30); B₄ treeViewer.setContentProvider(new ReverseAdapterFactoryContentProvider(adaptFactory)); C₂ parent.setLayout(new GridLayout( )); C₃ treeViewer.setAutoExpandLevel(30); C₄ treeViewer.setContentProvider(new ReverseAdapterFactoryContentProvider(adaptFactory)); L₀ TreeViewer tree = widgetFactory.createTreeViewer(container); L₁ tree.setLayoutData(new GridData(GridData.FILL_BOTH)); L₂ tree.setTitle(“My treeviewer”);

The translated assist lines to a user context, by the algorithms of FIGS. 2-3, for each of the preceding assist lines in the current iteration of R=2 are as follows. All variables are top level variables, so that I_(MAX)=0 in step 41 of FIG. 3 for all mappings. F

or L₀ (r=0), the minimum k is 0 in each example (A, B, C). The mapping for Example A is SelectionViewer→tree and parent→container from lines A₀ and L₀, the mapping for Example B is treeViewer→tree and parent→container from lines B₀ and L₀, and the mapping for Example C is treeViewer→tree and parent→container from lines C₀ and L₀., which results in the following translated lines:

A₂′ tree.setContentProvider(new AdapterFactoryContentProvider(adapterFactory)); A₃′ tree.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory)); B₂′ container.setLayout(fill); B₃′ tree.setAutoExpandLevel(30); B₄′ tree.setContentProvider(new ReverseAdapterFactoryContentProvider(adaptFactory)); C₂′ parent.setLayout(new GridLayout( )); C₃′ tree.setAutoExpandLevel(30); C₄′ tree.setContentProvider(new ReverseAdapterFactoryContentProvider(adaptFactory));

For L₁ (r=1), the minimum k is 1 in each example (A, B, C). The mapping for Example A is SelectionViewer→tree from lines A₁ and L₁, the mapping for Example B is parent→tree from lines B₁ and L₁, and the mapping for Example C is treeViewer→tree from lines C₁ and L₁, which results in the preceding translated lines not being further translated.

For L₂ (r=2), there is no minimum k, because no integer k for which any of the preceding translated lines match L₂, which results in the preceding translated lines not being further translated.

In step 16, any of the previously discussed criteria (“matched line grouping”, “positional equivalence grouping”, “matched variable grouping”) could be used to determine, from the set of assist lines, a set of preferred lines sequenced in an order of preference.

Another criteria for determining a set of preferred lines sequenced in order of preference is “line order grouping” which is defined as grouping of lines in which the set of first lines in the code examples form a first preferred group of lines, the set of second lines in the code examples form a second preferred group of lines, etc. For the illustrative example in one embodiment, the set of preferred lines are: the first preferred group of lines of (A₂′, B₂′, C₂′). In one embodiment, the set of preferred lines are: the first preferred group of lines of (A₂′, B₂′, C₂′), followed by the second preferred group of lines of (A₃′, B₃′, C₃′). In one embodiment the set of preferred lines are: a first preferred group of lines of (A₂′, B₂′, C₂′), followed by a second preferred group of lines of (A₃′, B₃′, C₃′), and followed by a third preferred group of lines of (B′, C₄′).

Another criteria for determining a set of preferred lines sequenced in order of preference is “method popularity grouping” which is defined as grouping of lines in which a method appears in more code examples than does any other method. This method is called a most popular method. For the illustrative example, the most popular method is setContentProvider which appears in all of the code examples (A, B, C). The second most popular method is setLayout (which appear in code examples A and C but not code example B) or setAutoExpandLevel (which appear in code examples B and C but not code example A). In one embodiment, the set of preferred lines consist of the lines in which the method setContentProvider appears (A₂′, B₄′, C₄′). In one embodiment, the set of preferred lines consist of the lines in which the method setContentProvider appears (A₂′, B₄′, C₄′), followed by the lines in which the method setAutoExpandLevel appears (B₃′, C₃′), followed by the lines in which the method setLayout appears (B₂′, C₂′). In one embodiment, the set of preferred lines consist of the lines in which the method setContentProvider appears (A₂′, B₄′, C₄′), followed by the lines in which the method setLayout appears (B₂′, C₂′), followed by the lines in which the method setAutoExpandLevel appears (B₃′, C₃′).

Step 17 presents to the user the set of preferred lines in the order of preference Step 18 receives an edited selected line that was selected by the user from the set of preferred lines.

Step 19 increments R to 3 and stores the new line L₃.

In the illustrated example, it is assumed that the process does not stop at step 20 after line L₃ has been stored in step 19. Thus the process loops back to step 13 to execute the next iteration characterized by R=3. It is assumed that a custom line of code has not been inputted for the R=3 iteration, so that the process executes the code assist branch of steps 14-18 to determine the next new line (L₄).

Step 14 increments K by 1 to K=3, determines N from N=F(R), determines NMIN, and identifies a set of assist lines X_(K), . . . , X_(MIN) in each code example X.

In the illustrative example, K=3 in the current iteration of R =3. Using F(R)=ceiling(1.5*R+1), it is determined that N=6. The maximum line number of code examples A, B, and C is 3, 5, and 5, respectively Therefore since each NMIN is the minimum of N and the maximum line number of the corresponding code example, NMIN is 3, 5, and 5 for code examples A, B, and C. respectively. Thus, the set of assist lines are: lines A₃ from Example A, lines B₃, B₄, B₅ from Example B, and lines C₃, C₄, C₅ from Example C.

Step 15 translates the set of assist lines according to the algorithm of FIGS. 2 and 3, as discussed supra.

Steps 16-18 are executed as in preceding iterations.

Step 19 increments R to 4 and stores the new line L₄.

Step 20 either stops the process of loops back to step 13 to perform the next iteration for R=4. At the current iteration or at a subsequent iteration, the process will stop at step 20.

FIG. 4 illustrates a computer system 90 used for assisting a user to write an ordered sequence of new lines of code of a computer program, in accordance with embodiments of the present invention. The computer system 90 comprises a processor 91, an input device 92 coupled to the processor 91, an output device 93 coupled to the processor 91, and memory devices 94 and 95 each coupled to the processor 91. The processor 91 is a processing unit such as a central processing unit (CPU). The input device 92 may be, inter alia, a keyboard, a mouse, etc. The output device 93 may be, inter alia, a printer, a plotter, a display device (e.g., a computer screen), a magnetic tape, a removable hard disk, a floppy disk, etc. The memory devices 94 and 95 may be, inter alia, a hard disk, a floppy disk, a magnetic tape, an optical storage such as a compact disc (CD) or a digital video disc (DVD), a dynamic random access memory (DRAM), a read-only memory (ROM), etc. The memory device 95 includes a computer code 97 which is a computer program that comprises computer-executable instructions. The computer code 97 includes an algorithm for assisting a user to write an ordered sequence of new lines of code of a computer program. The processor 91 executes the computer code 97. The memory device 94 includes input data 96. The input data 96 includes input required by the computer code 97. The output device 93 displays output from the computer code 97. Either or both memory devices 94 and 95 (or one or more additional memory devices not shown in FIG. 4) may be used as a computer usable storage medium (or program storage device) having a computer readable program embodied therein and/or having other data stored therein, wherein the computer readable program comprises the computer code 97. Generally, a computer program product (or, alternatively, an article of manufacture) of the computer system 90 may comprise said computer usable storage medium (or said program storage device).

While FIG. 4 shows the computer system 90 as a particular configuration of hardware and software, any configuration of hardware and software, as would be known to a person of ordinary skill in the art, may be utilized for the purposes stated supra in conjunction with the particular computer system 90 of FIG. 4. For example, the memory devices 94 and 95 may be portions of a single memory device rather than separate memory devices.

While particular embodiments of the present invention have been described herein for purposes of illustration, many modifications and changes will become apparent to those skilled in the art. Accordingly, the appended claims are intended to encompass all such modifications and changes as fall within the true spirit and scope of this invention. 

1. A process for assisting a user to write an ordered sequence of new lines of code (L₀, L₁, L₂, . . . ) of a computer program, said process using a plurality of code examples such that each code example comprises an ordered sequence of lines of code (X₀, X₁, X₂, . . . ), said process implemented by execution of instructions by a processor of a computer system, said instructions being stored on computer readable storage media of the computer system, said process utilizing an index R that points to line L_(R) (R=0, 1, 2, . . . ) and initially points to the first line L₀ of the new lines of code, said process utilizing an index K that points to line X_(K) (K=0, 1, 2, . . . ) and initially points to the first line X₀ of the ordered sequence of lines of code, said process comprising: receiving and storing line L₀, wherein is an anchor line; after said receiving and storing line L₀, selecting the plurality of code examples based on line X₀ in each selected code example matching line L₀ due to a method in line X₀ of each code example being of a same type and having a same signature as a method in line L₀; after said selecting the plurality of code examples, ascertaining whether a custom line of code is inputted after said storing line L_(R) is performed; if said ascertaining ascertains that a custom line of code is inputted after said storing line L_(R) is performed, then incrementing R by 1, followed by establishing line L_(R) as a new custom line of code, and followed by storing line L_(R); if said ascertaining ascertains that a custom line of code is not inputted after said storing line L_(R) is performed, then incrementing K by 1 and determining N=F(R) such that F(R) is a specified function of R, followed by identifying a set of assist lines (X_(K), X_(K+1), . . . , X_(NMIN)) in each code example X such that NMIN is a minimum of N and the highest line number in each code example, followed by translating the assist lines to a user context in each code example, followed by determining a set of preferred lines sequenced in an order of preference such that the preferred lines are selected from the translated assist lines in the code examples, followed by presenting to the user the set of preferred lines sequenced in the order of preference, followed by receiving a selected line selected by the user from the set of preferred lines, followed by incrementing R by 1, followed by establishing line L_(R) to be the edited selected line, and followed by storing line L_(R); and after storing line L_(R), stopping the process if a stopping criterion is satisfied, otherwise looping back to said ascertaining.
 2. The process of claim 1, wherein at R=R1 said ascertaining ascertains that a custom line of code is not inputted, said R1 being an integer of at least
 1. 3. The process of claim 2, wherein said translating comprises for each code example X: setting r=0 and a list S to empty; determining a minimum integer k such that k is selected from the group consisting of 0, 1, . . . , and XMIN, k is not in the list S, and line X_(k) matches line L_(r) due to a method in line X_(k) being of a same type and having a same signature as a method in line L_(r); hierarchically mapping variables in sub-expressions of line X_(k) to positionally equivalent variables in line L_(r); and after said hierarchically mapping, stopping said translating if r=R, otherwise incrementing r by 1, adding k to the list S, and looping back to said determining the minimum integer k.
 4. The process of claim 3, wherein said hierarchically mapping comprises for each code example X: determining a maximum sub-expression level (I_(MAX)) for lines X_(K), X_(K+1), . . . , X_(NMIN)); setting a sub-expression level index I to 0; for sub-expression level I, determining a mapping M_(I)(k→r) of at least one variable in line X_(k) to a corresponding at least one positionally equivalent variable in line Lr; applying the mapping M_(I)(k→r) to lines (X_(K), X_(K+1), . . . , X_(NMIN)) to partially translate lines (X_(K), X_(K+1), . . . , X_(NMIN)) to the user context; after determining a mapping M_(i)(k→r), stopping said hierarchically mapping if I=I_(MAX), otherwise incrementing I by 1 and looping back to said determining the mapping M_(I)(k→r) for sub-expression level I.
 5. The process of claim 4, wherein I_(MAX)≧1.
 6. The process of claim 2, wherein at R=R2≠R1 said ascertaining ascertains that a custom line of code is inputted, said R2 being an integer of at least
 1. 7. The process of claim 1, wherein said receiving the selected line comprises receiving the selected line after the selected line has been further translated to the user context by the user.
 8. A computer program product, comprising a computer readable storage medium having a computer readable program code stored therein, said computer readable program code containing instructions that when executed by a processor of a computer system implement a process for assisting a user to write an ordered sequence of new lines of code (L₀, L₁, L₂, . . . ) of a computer program, said process using a plurality of code examples such that each code example comprises an ordered sequence of lines of code (X₀, X₁, X₂, . . . ), said process utilizing an index R that points to line L_(R) (R=0, 1, 2, . . . ) and initially points to the first line L₀ of the new lines of code, said process utilizing an index K that points to line X_(K) (K=0, 1, 2, . . . ) and initially points to the first line X₀ of the ordered sequence of lines of code, said process comprising: receiving and storing line L₀, wherein is an anchor line; after said receiving and storing line L₀, selecting the plurality of code examples based on line X₀ in each selected code example matching line L₀ due to a method in line X₀ of each code example being of a same type and having a same signature as a method in line L₀; after said selecting the plurality of code examples, ascertaining whether a custom line of code is inputted after said storing line L_(R) is performed; if said ascertaining ascertains that a custom line of code is inputted after said storing line L_(R) is performed, then incrementing R by 1, followed by establishing line L_(R) as a new custom line of code, and followed by storing line L_(R); if said ascertaining ascertains that a custom line of code is not inputted after said storing line L_(R) is performed, then incrementing K by 1 and determining N=F(R) such that F(R) is a specified function of R, followed by identifying a set of assist lines (X_(K), X_(K+1), . . . , X_(NMIN)) in each code example X such that NMIN is a minimum of N and the highest line number in each code example, followed by translating the assist lines to a user context in each code example, followed by determining a set of preferred lines sequenced in an order of preference such that the preferred lines are selected from the translated assist lines in the code examples, followed by presenting to the user the set of preferred lines sequenced in the order of preference, followed by receiving a selected line selected by the user from the set of preferred lines, followed by incrementing R by 1, followed by establishing line L_(R) to be the edited selected line, and followed by storing line L_(R); and after storing line L_(R), stopping the process if a stopping criterion is satisfied, otherwise looping back to said ascertaining.
 9. The computer program product of claim 8, wherein at R=R1 said ascertaining ascertains that a custom line of code is not inputted, said R1 being an integer of at least
 1. 10. The computer program product of claim 9, wherein said translating comprises for each code example X: setting r=0 and a list S to empty; determining a minimum integer k such that k is selected from the group consisting of 0, 1, . . . , and XMIN, k is not in the list S, and line X_(k) matches line L_(r) due to a method in line X_(k) being of a same type and having a same signature as a method in line L_(r); hierarchically mapping variables in sub-expressions of line X_(k) to positionally equivalent variables in line L_(r); and after said hierarchically mapping, stopping said translating if r=R, otherwise incrementing r by 1, adding k to the list S, and looping back to said determining the minimum integer k.
 11. The computer program product of claim 10, wherein said hierarchically mapping comprises for each code example X: determining a maximum sub-expression level (I_(MAX)) for lines X_(K), X_(K+1), . . . , X_(NMIN)); setting a sub-expression level index I to 0; for sub-expression level I, determining a mapping M_(I)(k→r) of at least one variable in line X_(k) to a corresponding at least one positionally equivalent variable in line Lr; applying the mapping M_(I)(k→r) to lines (X_(K), X_(K+1), . . . , X_(NMIN)) to partially translate lines (X_(K), X_(K+1), . . . , X_(NMIN)) to the user context; after determining a mapping M_(i)(k→r), stopping said hierarchically mapping if I=I_(MAX), otherwise incrementing I by 1 and looping back to said determining the mapping M_(I)(k→r) for sub-expression level I.
 12. The computer program product of claim 11, wherein I_(MAX)≧1.
 13. The computer program product of claim 9, wherein at R=R2≠R1 said ascertaining ascertains that a custom line of code is inputted, said R2 being an integer of at least
 1. 14. The computer program product of claim 8, wherein said receiving the selected line comprises receiving the selected line after the selected line has been further translated to the user context by the user.
 15. A computer system comprising a processor and a computer readable memory unit coupled to the processor, said memory unit containing instructions that when executed by the processor implement a process for assisting a user to write an ordered sequence of new lines of code (L₀, L₁, L₂, . . . ) of a computer program, said process using a plurality of code examples such that each code example comprises an ordered sequence of lines of code (X₀, X₁, X₂, . . . ), said process utilizing an index R that points to line L_(R) (R=0, 1, 2, . . . ) and initially points to the first line L₀ of the new lines of code, said process utilizing an index K that points to line X_(K) (K=0, 1, 2, . . . ) and initially points to the first line X₀ of the ordered sequence of lines of code, said process comprising: receiving and storing line L₀, wherein is an anchor line; after said receiving and storing line L₀, selecting the plurality of code examples based on line X₀ in each selected code example matching line L₀ due to a method in line X₀ of each code example being of a same type and having a same signature as a method in line L₀; after said selecting the plurality of code examples, ascertaining whether a custom line of code is inputted after said storing line L_(R) is performed; if said ascertaining ascertains that a custom line of code is inputted after said storing line L_(R) is performed, then incrementing R by 1, followed by establishing line L_(R) as a new custom line of code, and followed by storing line L_(R); if said ascertaining ascertains that a custom line of code is not inputted after said storing line L_(R) is performed, then incrementing K by 1 and determining N=F(R) such that F(R) is a specified function of R, followed by identifying a set of assist lines (X_(K), X_(K+1), . . . , X_(NMIN)) in each code example X such that NMIN is a minimum of N and the highest line number in each code example, followed by translating the assist lines to a user context in each code example, followed by determining a set of preferred lines sequenced in an order of preference such that the preferred lines are selected from the translated assist lines in the code examples, followed by presenting to the user the set of preferred lines sequenced in the order of preference, followed by receiving a selected line selected by the user from the set of preferred lines, followed by incrementing R by 1, followed by establishing line L_(R) to be the edited selected line, and followed by storing line L_(R); and after storing line L_(R), stopping the process if a stopping criterion is satisfied, otherwise looping back to said ascertaining.
 16. The computer system of claim 15, wherein at R=R1 said ascertaining ascertains that a custom line of code is not inputted, said R1 being an integer of at least
 1. 17. The computer system of claim 16, wherein said translating comprises for each code example X: setting r=0 and a list S to empty; determining a minimum integer k such that k is selected from the group consisting of 0, 1, . . . , and XMIN, k is not in the list S, and line X_(k) matches line L_(r) due to a method in line X_(k) being of a same type and having a same signature as a method in line L_(r); hierarchically mapping variables in sub-expressions of line X_(k) to positionally equivalent variables in line L_(r); and after said hierarchically mapping, stopping said translating if r=R, otherwise incrementing r by 1, adding k to the list S, and looping back to said determining the minimum integer k.
 18. The computer system of claim 17, wherein said hierarchically mapping comprises for each code example X: determining a maximum sub-expression level (I_(MAX)) for lines X_(K), X_(K+1), . . . X_(NMIN)); setting a sub-expression level index I to 0; for sub-expression level I, determining a mapping M_(I)(k→r) of at least one variable in line X_(k) to a corresponding at least one positionally equivalent variable in line Lr; applying the mapping M_(I)(k→r) to lines (X_(K), X_(K+1), . . . , X_(NMIN)) to partially translate lines (X_(K), X_(K+1), . . . , X_(NMIN)) to the user context; after determining a mapping M_(i)(k→r), stopping said hierarchically mapping if I=I_(MAX), otherwise incrementing I by 1 and looping back to said determining the mapping M_(I)(k→r) for sub-expression level I.
 19. The computer system of claim 18, wherein I_(MAX)≧1.
 20. The computer system of claim 16, wherein at R=R2≠R1 said ascertaining ascertains that a custom line of code is inputted, said R2 being an integer of at least
 1. 21. The computer system of claim 15, wherein said receiving the selected line comprises receiving the selected line after the selected line has been further translated to the user context by the user. 